Jak naplnit MemoryStream pomoci DLL?

Otázka od: little_bobes@centrum.cz

1. 7. 2004 7:49

Zdravim,

zacal jsem si hrat s knihovnami, lepe receno chci svou aplikaci rozsekat na
knihovny.
Ale ted jsem narazil na %subject%.
V hlavnim programu jsem si vytvoril TMemoryStream, ktery chci v DLL necim
naplnit a ve sve aplikaci chci s temito daty dale pracovat.
Vyzkousel jsem variantu i s runtime balicky, ale stale je nekde chyba.

hlavni program:
type
    TMemStr = ^TMemoryStream;
    TAKC = procedure (Output: TMemStr);
...
type
  TForm1 = class(TForm)
  private
    AKC: TAKC;
  end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  Hendl: THandle;
  pomRes: TMemoryStream;
begin
        Hendl := MyLoadLibrary;
        If Hendl <> 0 then
        begin
          @AKC := GetProcAddress(Hendl, PChar('AKC'));
          try
            pomRes := TMemoryStream.Create;
            If @AKC <> nil then AKC(@pomRes);
            if pomRes.Size > 0 then ShowMessage(IntToStr(pomRes.Size));
          finally
            FreeAndNil(pomRes);
            FreeLibrary(Hendl);
          end;
        end;
end;

DLL:
type
  TMemStr = ^TMemoryStream;
...
procedure AKC(Output: TMemStr); stdcall;
begin
   ...
    Output^.Clear; // access violation
    ...
end;

Poradite mi nekdo, v cem by mohla byt chyba nebo jak mam predavat ruzne
parametry do/z knihoven, abych nemusel runtime balicky pouzivat, pripadne
nejaky odkaz na net, kde by toto bylo obsahleji popsano?
Predem dekuji

Bob
(D4 c/s, FB 1.5)



Odpovedá: Daniel Rott

1. 7. 2004 8:26

> V hlavnim programu jsem si vytvoril TMemoryStream, ktery chci
> v DLL necim naplnit a ve sve aplikaci chci s temito daty dale pracovat.

Udelal bych to tak, ze hlavni aplikace by funkci v DLL predala adresu sve
procedury na zapis do streamu. Tato funkce by mela za parametry pointer a
pocet bajtu, funkce v DLL by jen ukazala na data ktera chce zapsat a zapsala
by si je sama aplikace => nebudou problemy s memory managerem, bude to
fungovat i bez balicku.

Daniel
---------------------------------------------------------------
Scanning complete: NO intelligent life form in range.



Odpovedá: Ondrej Kelle

1. 7. 2004 8:57

> hlavni program:
> type
> TMemStr = ^TMemoryStream;
> TAKC = procedure (Output: TMemStr);

Chyba Ti tam direktiva stdcall;

Objekty su pointre, takze staci predavat rovno TMemoryStream, nemusis
deklarovat TMemStr.

HTH
TOndrej